# -*- coding: UTF-8 -*-
"""
@Filename:exerc3.py
@author:Cora
@time:2025-03-14
"""
def user_registration():
    # 输入ID
    while True:
        id = input("请输入ID：")
        if check_id(id):
            break
        print("ID不符合要求，长度不能超过8位，且只能由数字、字母、下划线组成")

        # 输入邮箱地址
    while True:
        email = input("请输入EMAIL地址：")
        if check_email(email):
            break
        print("EMAIL地址不符合基本格式")

        # 输入身份证号
    while True:
        id_card = input("请输入身份证号：")
        if check_id_card(id_card):
            break
        print("身份证号不符合基本格式")

        # 输入姓名
    while True:
        name = input("请输入姓名：")
        if check_name(name):
            break
        print("姓名不符合要求，只能是中文且不能超过4位")

        # 从身份证号中获取性别
    gender = get_gender(id_card)

    # 输出用户信息
    print("用户信息如下：")
    print(f"ID: {id}")
    print(f"EMAIL地址: {email}")
    print(f"身份证号: {id_card}")
    print(f"姓名: {name}")
    print(f"性别: {gender}")

def check_id(id):
    # 检查ID长度和字符合法性
    if len(id) > 8:
        return False
    for char in id:
        if not (char.isalnum() or char == '_'):
            return False
    return True

def check_email(email):
    # 检查EMAIL地址基本格式
    if '@' not in email or '.' not in email:
        return False
    #@和.将邮箱地址分为两部分
    q_part, h_part = email.split('@', 1)
    #检查q_part, h_part是否为空
    if not q_part or not h_part:
        return False
    #检查h_part是否包含.
    if '.' not in h_part or '.' == h_part[len(h_part) - 1]:
        return False
    return True

def check_id_card(id_card):
    # 检查身份证号长度
    if len(id_card) != 18:
        return False

    # 检查身份证号是否为数字（最后一位可以是X）
    for i in range(17):
        if not id_card[i].isdigit():
            return False
    if not (id_card[17].isdigit() or id_card[17].upper() == 'X'):
        return False

    # 检查出生日期
    birth_date = id_card[6:14]
    year = int(birth_date[:4])
    month = int(birth_date[4:6])
    day = int(birth_date[6:8])
    if not check_birth_date(year, month, day):
        return False
    return True

def check_birth_date(year, month, day):
    # 检查出生日期是否合法
    if year < 1900 or year > 2025:
        return False
    if month < 1 or month > 12:
        return False
    if day < 1 or day > 31:
        return False
    # 检查月份和日期是否匹配
    days_in_month = [31, 29 if is_leap_year(year) else 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if day > days_in_month[month - 1]:
        return False
    return True

def is_leap_year(year):
    # 判断是否为闰年
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

def check_name(name):
    # 检查姓名是否为中文且长度不超过4
    if len(name) > 4:
        return False
    for char in name:
        if not '\u4e00' <= char <= '\u9fff':
            return False
    return True

def get_gender(id_card):
    # 从身份证号中获取性别
    gender_code = int(id_card[16])
    return "男" if gender_code % 2 == 1 else "女"

# 运行用户注册程序
user_registration()